package com.leetcode.hash.demo6;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author Zan
 * @Create 2024/5/22 11:57
 * @ClassName: Test
 * @Description : https://leetcode.cn/problems/ransom-note/  赎金信
 */
public class Test {
    public static void main(String[] args) {
        String ransomNote = "aa";
        String magazine = "aab";
        Solution solution = new Solution();
        solution.canConstruct(ransomNote, magazine);
    }
}

// 字符串解法
// 思路：将后面的字符串存入数组，然后由第一个数组相减，如果有一个<0，那就直接返回，如果没有，全部剪完了，那就return true
class Solution {
    public boolean canConstruct(String ransomNote, String magazine) {
        if (ransomNote.length() > magazine.length()) {
            return false;
        }
        int[] cnt = new int[26];
        for (char c : magazine.toCharArray()) {
            cnt[c - 'a']++;
        }
        for (char c : ransomNote.toCharArray()) {
            cnt[c - 'a']--;
            if(cnt[c - 'a'] < 0) {
                return false;
            }
        }
        return true;
    }
}

// Hash写法
class Solution2 {
    public boolean canConstruct(String ransomNote, String magazine) {
        // 可以用一个map来存储，进行++，进行--，最后如果可以归0那就成功了
        Map<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < ransomNote.length(); i++) {
            map.put(ransomNote.charAt(i), map.getOrDefault(ransomNote.charAt(i), 0) + 1);
        }

        // 遍历后面的数组，是否能够--为0
        for (int i = 0; i < magazine.length(); i++) {
            if (map.containsKey(magazine.charAt(i))) {
                map.put(magazine.charAt(i), map.get(magazine.charAt(i)) - 1);
                if (map.get(magazine.charAt(i)) == 0) {
                    map.remove(magazine.charAt(i));
                }
            }
        }
        if (map.size() == 0) {
            return true;
        }
        return false;
    }
}